Implemented Peripheral wrapper identity map #11
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Calling
retrieveConnectedPeripherals()or other connection methods multiple times for the sameCBPeripheralwould create newConnectedPeripheralwrapper instances, causing:• Delegate overwrite: Each new wrapper set
cbPeripheral.delegate, breaking previous wrappers• Zombie sessions: Old wrappers stopped receiving callbacks (notifications, reads, writes)
• Memory leaks: Multiple wrappers tracking the same peripheral
Solution
Implemented an identity map pattern with weak references to ensure at most one live wrapper per
CBPeripheral.identifier:• Added
WeakBox<T>helper for storing weak references• Added
peripheralWrappers: [UUID: WeakBox<ConnectedPeripheral>]identity map• Created
getOrCreateWrapper(for:)to serve as single point of wrapper creation• Replaced all 4 direct
ConnectedPeripheral(...)instantiations withgetOrCreateWrapper• Added automatic cleanup of dead weak references
• Added detection/logging for duplicate
CBPeripheralinstances